<?php

/*
 * @titulo: clases y funciones para mySQL
 */

class dbmaster {

  var $db;
  private $minutos_bloqueo= 5; //tiempo de bloqueo en minutos
  private $datos = array("host" => "localhost", "user" => "root", "password" => "tacoronte", "name" => "neumo_db");
  private $tbl_usuario;

  //abre la base de datos
  function dbmaster() {
    $this->db = mysql_connect($this->datos["host"], $this->datos["user"], $this->datos["password"]) or (die("No he podido conectar con la base de datos: " . mysql_error()));
    mysql_select_db($this->datos["name"], $this->db) or die('Error al seleccionar la base de datos: ' . mysql_error());
  }

  function cierra() {
   // mysql_close($this->db) or (die("No he podido cerrar la base de datos: " . mysql_error()));
  }

  /*
  * funcion que devuelve el valor de un campo indicando el ID o el registro completo
  */

  function get($id, $campo) {
    $hijo = get_class($this);
    switch ($hijo) {
      case 'dbase_usuario':
        $sql = 'SELECT * FROM usuarios WHERE id_usuario= ' . $id;
        break;
     case 'dbase_objeto':
        $sql = 'SELECT * FROM objetos WHERE id_objeto= ' . $id;
        break;
      case 'dbase_tipo':
        $sql = 'SELECT * FROM cfdtipos WHERE id_tipo= ' . $id;
        break;
      default:
        die('Error: No se ha seleccionado la base de datos ');
        break;
    }
    ($rsl = mysql_query($sql)) or die('Error en la function get: ' . mysql_error());
    $rows = mysql_fetch_assoc($rsl);
    return $rows[$campo];
  }
  function get_file($id) {
    $hijo = get_class($this);
    switch ($hijo) {
      case 'dbase_usuario':
        $sql = 'SELECT * FROM usuarios WHERE id_usuario= ' . $id;
        break;
     case 'dbase_objeto':
        $sql = 'SELECT * FROM objetos WHERE id_objeto= ' . $id;
        break;
      case 'dbase_tipo':
        $sql = 'SELECT * FROM cfdtipos WHERE id_tipo= ' . $id;
        break;
      default:
        die('Error: No se ha seleccionado la base de datos ');
        break;
    }
    ($rsl = mysql_query($sql)) or die('Error en la function get: ' . mysql_error());
    $rows = mysql_fetch_assoc($rsl);
    return $rows;
  }

  /*
  * funcion que actualiza el valor de un campo y devuelve el valor
  */
  function put($id, $campo, $valor) {
    $hijo = get_class($this);
    switch ($hijo) {
      case 'dbase_usuario':
        $sql = 'UPDATE usuarios SET ' . $campo . '= ' . $valor . ' WHERE id_usuario= ' . $id;
        break;
     case 'dbase_objeto':
    $sql = 'UPDATE objetos SET ' . $campo . '= ' . $valor . ' WHERE id_objeto= ' . $id;
        break;
      default:
        die('Error: No se ha seleccionado la base de datos ');
        break;
    }
  mysql_query($sql) or die('Error en la funcion PUT: ' . mysql_error());
  return $valor;
  }
  /*
  * Control de bloqueo
  * 1) Al abrir registro para modificar lee el campo <proteccion> y si el tiempo actual es menor
  * indicar que el registro está utilizado por otro usuario que es probable que quede liberado en xx minutos.
  * 2) Si puede abrirlo, para modificación, el campo <proteccion> toma el valor time + 30 minutos (a estudiar).
  * 3) El valor de campo se lo lleva al form y vuele como campo oculto.
  * 4) Si al escribirlo el valor de campo es el mismo del hide entoces lo escribe poniendo el valor de campo
  *  a tiempo acutla menos 1000 minutos.
  * 5) Si es diferente indicará que ha mantenido la ficha abierta demasiado tiempo y ha sido modificada por otor
  * usuario.
  * Resuem: 
  * - Se crea el campo <proteccion> con valor 0;
  * - Se crea campos hide en el formulario de moficiación.
  * - se crwa la function  proteccion parmetros modo e id del usuario
  * 
  */

  function proteccion($id, $modo, $cmp_hide = 0) {
    //modo 0: lee 1: escribe 2: escritura cuando cancela
    $output = new stdClass();
    $output->error = false;
    $output->msj = '';
    $output->valor = 0;
    if ($id != -1){
    $cmp_proteccion = $this->get($id, 'proteccion');
      if ($modo == 0) {
        if (time() > $cmp_proteccion) {
          //escribe campo con valor actual + 5 minutos devuelve error=0 y valor del campo.
          $output->valor = $this->put($id, 'proteccion', time() + 60 * $this->minutos_bloqueo);
          //        $output->valor= $this->put($id,'proteccion', 0);
        } else {
          //devuele error con msj.
          $output->error = true;
          $output->msj = 'Los datos están siendo modificados por otro usuario.<br>' .
                  'Inténtelo nuevamente en ' . intval((($cmp_proteccion - time()) / 60) + 1) . ' minutos.';
        }
      }
      if ($modo == 1) {
        if ($cmp_proteccion == $cmp_hide) {
          $this->put($id, 'proteccion', 0);
        } else {
          $output->error = true;
          $output->msj = 'Ha tenido los datos demasiado tiempo sin guardar y otro usuari lo ha modificado';
        }
      }
      if ($modo == 2) {
        if ($cmp_proteccion == $cmp_hide) {
          $this->put($id, 'proteccion', 0);
        }
      }
    }
    return $output;
  }

 } //fin de class

 class dbase_general extends dbmaster{
    
   function toma_datos(){
    $sql= 'select * from general where id_general= 1';
    ($rsl= mysql_query($sql,$this->db)) or die ('Error al tomar dato de general '. mysql_error());
    return mysql_fetch_assoc($rsl);
   }
 }
 
class dbase_tipo extends dbmaster{
  
}
 
class dbase_extension extends dbmaster{
  
 }

class dbase_usuario extends dbmaster {

  private function usuario_checkbox($valor) {
  (isset($valor['solicitud_socio'])) ? $this->tbl_usuario["solicitud_socio"] = 1 : $this->tbl_usuario["solicitud_socio"] = 0;
  (isset($valor['es_socio'])) ? $this->tbl_usuario["es_socio"] = 1 : $this->tbl_usuario["es_socio"] = 0;
  (isset($valor['es_area'])) ? $this->tbl_usuario["es_area"] = 1 : $this->tbl_usuario["es_area"] = 0;
  (isset($valor['es_congreso'])) ? $this->tbl_usuario["es_congreso"] = 1 : $this->tbl_usuario["es_congreso"] = 0;
  (isset($valor['es_admin'])) ? $this->tbl_usuario["es_admin"] = 1 : $this->tbl_usuario["es_admin"] = 0;
  (isset($valor['es_bloqueo'])) ? $this->tbl_usuario["es_bloqueo"] = 1 : $this->tbl_usuario["es_bloqueo"] = 0;
  }

  function inserta($valor) {
  $this->usuario_checkbox($valor);
  $this->tbl_usuario["nombre"] = mysql_real_escape_string($valor["nombre"]);
  $this->tbl_usuario["apellidos"] = mysql_real_escape_string($valor["apellidos"]);
  //    $this->tbl_usuario["direccion"] = mysql_real_escape_string($valor["direccion"]);
  //    $this->tbl_usuario["codpostal"] = mysql_real_escape_string($valor["codpostal"]);
  //    $this->tbl_usuario["provincia"] = mysql_real_escape_string($valor["provincia"]);
  //    $this->tbl_usuario["cargo"]= $valor["cargo"];
  $this->tbl_usuario["correo"] = mysql_real_escape_string(strtolower($valor["correo"]));
  $this->tbl_usuario["correo_md5"] = mysql_real_escape_string(md5(strtolower($valor["correo"])));
  $this->tbl_usuario["password"] = mysql_real_escape_string(md5($valor["password"]));
  $s_campo = "";
  foreach ($this->tbl_usuario as $field => $value) {
  $s_campo[] = $field;
  $s_valor[] = "'" . $value . "'";
  }
  $s_sql = "INSERT INTO usuarios  (" . join(",", $s_campo) . ") VALUES (" . join(",", $s_valor) . ")";
  $s_rsl = mysql_query($s_sql, $this->db) or die('Error en la insersión de los datos de usuario' . mysql_error());

  return $this->tbl_usuario["correo_md5"];
  }

  function actualiza_usuario($id, $valor, $correo_nuevo) {
    $this->usuario_checkbox($valor);
    $this->tbl_usuario["nombre"] = mysql_real_escape_string($valor["nombre"]);
    $this->tbl_usuario["apellidos"] = mysql_real_escape_string($valor["apellidos"]);
    //    $this->tbl_usuario["direccion"] = mysql_real_escape_string($valor["direccion"]);
    //    $this->tbl_usuario["codpostal"] = mysql_real_escape_string($valor["codpostal"]);
    //    $this->tbl_usuario["provincia"] = mysql_real_escape_string($valor["provincia"]);
    if (isset($valor["cargo"])) $this->tbl_usuario["cargo"] = $valor["cargo"];
    $this->tbl_usuario["correo"] = mysql_real_escape_string(strtolower($valor["correo"]));
    $this->tbl_usuario["correo_md5"] = mysql_real_escape_string(md5(strtolower($valor["correo"])));
    if ($correo_nuevo) {
      $this->tbl_usuario["correo_valido"] = 0;
    }
    if ($valor["password"] != 'xxx321YY') { //clave ha sido cambiada
      $this->tbl_usuario["password"] = mysql_real_escape_string(md5($valor["password"]));
    }
    $s_sql = "UPDATE usuarios SET ___";
    foreach ($this->tbl_usuario as $field => $value) {
      $s_sql.= ", " . $field . "='" . $value . "'";
    }
    $s_sql.= " WHERE id_usuario = " . $id;
    $s_sql = str_replace("___,", "", $s_sql);
    $s_rsl = mysql_query($s_sql, $this->db);
    if ($s_rsl === FALSE)
    die("Error en la actualización de datos: " . mysql_error());
    return $this->tbl_usuario["correo_md5"];
  }

function correo_usuario_duplicado($id, $correo) {
if ($id == -1) {
$s_sql = "SELECT  id_usuario FROM  usuarios WHERE  correo = '" . $correo . "'";
$s_rsl = mysql_query($s_sql, $this->db);
} else {
$s_sql = "SELECT  id_usuario FROM  usuarios WHERE  correo = '" . $correo . "' AND id_usuario <> " . $id;
$s_rsl = mysql_query($s_sql, $this->db);
}
if ($s_rsl === FALSE)
die("Error en la busqueda de duplicado de correos: " . mysql_error());
return mysql_num_rows($s_rsl);
}

//toma datos para la ficha de modificación de usuario
function perfil_usuario_get($id) {
if ($id == -1) {
$val = new stdClass;
$val->id_usuario = -1;
$val->nombre = '';
$val->correo = '';
$val->apellidos = '';
$val->password = '';
$val->es_socio = 0;
$val->solicitud_socio = 0;
$val->cargo = 1;
$val->proteccion = 0;
return $val;
} else {
$this->proteccion(0, $id);
$s_sql = "SELECT * FROM usuarios WHERE id_usuario = " . $id;
$s_rsl = mysql_query($s_sql, $this->db);
if ($s_rsl === FALSE)
die("Error en la extracción de datos de usuario: " . mysql_error());
return (object) mysql_fetch_assoc($s_rsl);
}
}

/*
 * retorna falso si no hay concordancia.
 * En ccaso correcto devuelve id y nombre del usuario.
 */

function clave_usuario_comprueba($correo, $clave) {
$s_sql = "SELECT * FROM usuarios WHERE correo= '" . $correo . "' AND password= '" . mysql_real_escape_string(md5($clave)) . "' AND correo_valido = 1";
$s_rsl = mysql_query($s_sql, $this->db);
if ($s_rsl === FALSE)
die("Error en la comprobación de usuario " . mysql_error());
if (mysql_num_rows($s_rsl) != 0) {
$file = mysql_fetch_assoc($s_rsl);
$output["nombre"] = $file["nombre"];
$output["apellidos"] = $file["apellidos"];
$output["id"] = $file["id_usuario"];
$output["socio"] = $file["es_socio"];
$output["admin"] = $file["es_admin"];
$output["area"] = $file["es_area"];
$output["bloqueo"] = $file["es_bloqueo"];
$output["congreso"] = $file["es_congreso"];
return $output;
}
return (FALSE);
}

function cargos() {
$sql = "SELECT * FROM cdfcargo";
($rsl = mysql_query($sql, $this->db)) or die("Error con tabla de cargos:" . mysql_error());
return mysql_fetch_array($rsl);
}
}

class dbase_objeto extends dbmaster {

function inserta($valor) {
  $this->tbl_objeto["tipo"] = mysql_real_escape_string($valor["obj_tipo_selec"]);
  $this->tbl_objeto["borrador"] = mysql_real_escape_string($valor["obj_borrador"]);
  $this->tbl_objeto["aprobado"] = mysql_real_escape_string($valor["obj_aprobado"]);
  $this->tbl_objeto["titulo"] = trim(mysql_real_escape_string($valor["obj_titulo"]));
  $this->tbl_objeto["comentario"] = trim(mysql_real_escape_string($valor["obj_comentario"]));
  $this->tbl_objeto["fecha_creacion"] = normalize_date(mysql_real_escape_string($valor["obj_fecha_creacion"]));
  $this->tbl_objeto["fecha_borrar"] = normalize_date(mysql_real_escape_string($valor["obj_fecha_borrar"]));
  $this->tbl_objeto["fecha_publicacion"] = normalize_date(mysql_real_escape_string($valor["obj_fecha_publicacion"]));
  $this->tbl_objeto["fecha_nopublicacion"] = normalize_date(mysql_real_escape_string($valor["obj_fecha_nopublicacion"]));
  $this->tbl_objeto["perfil"] = $valor['obj_perfil'];
  $this->tbl_objeto["autor"]= $valor['obj_autor'];
  $s_campo = "";
  foreach ($this->tbl_objeto as $field => $value) {
    $s_campo[] = $field;
    $s_valor[] = "'" . $value . "'";
  }
  $s_sql = "INSERT INTO objetos  (" . join(",", $s_campo) . ") VALUES (" . join(",", $s_valor) . ")";
  mysql_query($s_sql, $this->db) or die('Error en la insersión de los datos de objetos: ' . mysql_error());
  $id_nuevo = mysql_insert_id($this->db);
  $this->inserta_enlace($valor, $id_nuevo);
  return $id_nuevo;
}

function inserta_enlace($valor, $id) {
  //elimina todos los enlaces anteriores
  $s_sql = "DELETE FROM enlaces WHERE id_objeto= " . $id;
  mysql_query($s_sql) or die('Error en el borrado de enlaces: ' . mysql_error());
  $i = 0;
  $cmp_nombre = 'obj_link_nombre_';
  $cmp_enlace = 'obj_link_';
  for ($i = 0;
    $i < 50;
    $i++) {
    if (isset($valor[$cmp_nombre . $i])) {
      $s_sql = "INSERT INTO enlaces ( id_objeto, nombre, enlace ) VALUES (" .
      $id . ",'" . trim(mysql_real_escape_string($valor[$cmp_nombre . $i])) . "','" .
      trim(mysql_real_escape_string($valor[$cmp_enlace . $i])) . "')";
      mysql_query($s_sql) or die('Error en la inserción de enlaces: ' . mysql_error());
    }
  }
}

function actualiza($id, $valor) {
  $this->tbl_objeto["tipo"] =               $valor["obj_tipo_selec"];
  $this->tbl_objeto["borrador"] =           mysql_real_escape_string($valor["obj_borrador"]);
  $this->tbl_objeto["aprobado"] =           mysql_real_escape_string($valor["obj_aprobado"]);
  $this->tbl_objeto["titulo"] =             trim(mysql_real_escape_string($valor["obj_titulo"]));
  $this->tbl_objeto["comentario"] =         trim(mysql_real_escape_string($valor["obj_comentario"]));
  $this->tbl_objeto["fecha_creacion"] =     normalize_date(mysql_real_escape_string($valor["obj_fecha_creacion"]));
  $this->tbl_objeto["fecha_borrar"] =       normalize_date(mysql_real_escape_string($valor["obj_fecha_borrar"]));
  $this->tbl_objeto["fecha_publicacion"] =  normalize_date(mysql_real_escape_string($valor["obj_fecha_publicacion"]));
  $this->tbl_objeto["fecha_nopublicacion"]= normalize_date(mysql_real_escape_string($valor["obj_fecha_nopublicacion"]));
  $this->tbl_objeto["perfil"] =             $valor['obj_perfil'];

  $datos = '___';
  foreach ($this->tbl_objeto as $field => $value) {
    switch ($field) {
      case 'borrador':
      case 'aprobado':
      case 'perfil':
        $datos.= ", $field = $value ";
        break;
      default:
        $datos.= ", $field = '$value' ";
        break;
    }
  }
  $datos = str_replace("___,", "", $datos);
  $s_sql = "UPDATE objetos SET $datos WHERE id_objeto = $id";
  mysql_query($s_sql, $this->db) or die('Error en la actualización de los datos de objetos: ' . mysql_error());

  $this->inserta_enlace($valor, $id);

return $id;
}

//devuelve el tiempo grabado en el edit
function comprueba_edicionxxx($id) {
  $sql = "SELECT edit FROM objetos WHERE id_objeto= " . $id;
  $rsl = mysql_query($sql) or die('Error al leer edit :' . mysql_error());
  $file = mysql_fetch_assoc($rsl);
  return $file['edit'];
}

function select_all() {
return '
      SELECT 
        id_objeto,
        proteccion,
        autor,
        tipo,
        borrador,
        aprobado,
        titulo, 
        comentario, 
        date_format( fecha_creacion, "%d/%m/%Y") as ffecha_creacion,
        date_format( fecha_borrar, "%d/%m/%Y") as ffecha_borrar,
        date_format( fecha_publicacion, "%d/%m/%Y") as ffecha_publicacion,
        date_format( fecha_nopublicacion, "%d/%m/%Y") as ffecha_nopublicacion,
        perfil
     FROM
        objetos
    ';
}
  function get_datos($pid) {
    $dat = new stdClass();
    if ($pid == -1) {
      $dat->id =                     -1;
      $dat->proteccion =              0;
      $dat->tipo =                    1;
      $dat->borrador =                true;
      $dat->aprobado =                false;
      $dat->titulo =                  '';
      $dat->comentario =              '';
      $dat->fecha_creacion =          date('d/m/Y');
      $dat->fecha_borrar =            date('d/m/Y', time() + 365 * 24 * 60 * 60);
      $dat->fecha_publicacion =       date('d/m/Y');
      $dat->fecha_nopublicacion =     date('d/m/Y', time() + +365 / 2 * 24 * 60 * 60);
      $dat->perfil =                  0;
      $dat->autor= 0;
    }else{
    //  marca_stamp($pid);
      $s_sql = $this->select_all() . ' WHERE id_objeto =' . $pid;
      $s_rsl = mysql_query($s_sql, $this->db);
      $s_rsl or die('Error al seleccionar la tabla de noticias: ' . mysql_error());
      if (mysql_num_rows($s_rsl) > 0) {
        $file = mysql_fetch_assoc($s_rsl);
        $dat->id =                  $file['id_objeto'];
        $dat->proteccion =          $file['proteccion'];
        $dat->tipo =                $file['tipo'];
        $dat->borrador =            $file['borrador'];
        $dat->aprobado =            $file['aprobado'];
        $dat->titulo =              $file['titulo'];
        $dat->comentario =          $file['comentario'];
        $dat->fecha_creacion =      $file['ffecha_creacion'];
        $dat->fecha_borrar =        $file['ffecha_borrar'];
        $dat->fecha_publicacion =   $file['ffecha_publicacion'];
        $dat->fecha_nopublicacion = $file['ffecha_nopublicacion'];
        $dat->perfil =              $file['perfil'];
        $dat->autor=                $file['autor'];
      };
      $s_sql = 'SELECT * FROM enlaces WHERE  id_objeto = ' . $pid;
      $s_rsl = mysql_query($s_sql, $this->db);
      $s_rsl or die('Error al seleccionar la tabla de Enlacess: ' . mysql_error());
      $i = 0;
      while ($row = mysql_fetch_array($s_rsl, MYSQL_ASSOC)) {
        $dat->enlace[$i]['nombre'] = $row['nombre'];
        $dat->enlace[$i]['enlace'] = $row['enlace'];
        $i+=1;
      }
    }
    return $dat;
  }
}

function normalize_date($date) {
  if (!empty($date)) {
  $var = explode('/', str_replace('-', '/', $date));
  return "$var[2]/$var[1]/$var[0]";
  }
}

function convierte_operador_jquery($pbsc_campo, $pbsc_oper, $pbsc_palabra) {
switch ($pbsc_oper) {
case 'eq': $opr = ' = "' . $pbsc_palabra . '"';
break;
case 'ne': $opr = ' <> "' . $pbsc_palabra . '"';
break;
case 'lt': $opr = ' <  "' . $pbsc_palabra . '"';
break;
case 'le': $opr = ' <= "' . $pbsc_palabra . '"';
break;
case 'qt': $opr = ' >  "' . $pbsc_palabra . '"';
break;
case 'qe': $opr = ' => "' . $pbsc_palabra . '"';
break;
case 'in': $opr = ' LIKE "%' . $pbsc_palabra . '%"';
break;
case 'ni': $opr = ' NOT LIKE "%' . $pbsc_palabra . '%"';
break;
case 'bw': $opr = ' LIKE  "' . $pbsc_palabra . '%"';
break;
case 'bn': $opr = ' NOT LIKE "' . $pbsc_palabra . '%"';
break;
case 'ew': $opr = ' LIKE "%' . $pbsc_palabra . '"';
break;
case 'en': $opr = ' NOT LIKE "%' . $pbsc_palabra . '"';
break;
case 'cn': $opr = ' LIKE "%' . $pbsc_palabra . '%"';
break;
case 'nc': $opr = ' NOT LIKE "%' . $pbsc_palabra . '%"';
break;
case "nu": $opr = ' IS NULL ';
$pbsc_palabra = '';
break;
case "nn": $opr = ' IS NOT NULL ';
$pbsc_palabra = '';
break;
default: $opr = " 1 ";
break;
}
return ($pbsc_campo . $opr);
}


/*
 * Crea filtros para los objetos
 */
function objeto_crea_filtro($tipo,$busca,$borrador,$aprobado, $perfil, $publicacion, $nopublicacion){
  $filtro=' (1=1) ';
  if ($tipo){ //tipo 0 no filtra
    $filtro.= ' and ( tipo =' . $tipo. ') ';
  }
  if ($borrador){
    $filtro.= ' AND (borrador = 1) ';
  }
  if ($aprobado){
    $filtro.= ' AND (aprobado = 1) ';
  }  
  if ($perfil){
    $perfil_usuario=  1 * nivel_seguridad('registrado') + 2 * nivel_seguridad('socio');
    $filtro.= ' AND ('. $perfil_usuario .' >= perfil) ';    
  }
  if ($publicacion){
    $filtro.= ' AND (fecha_publicacion <= current_date ) ';
  }
  if ($nopublicacion){
    $filtro.= ' AND (current_date < fecha_nopublicacion ) ';
  }
  if ($busca){
    $filtro.= ' AND (( titulo LIKE "%'. $busca .'%") OR ( comentario LIKE "%'. $busca .'%")) ';
  }
  return $filtro;
}


?>
